package com.pattern.once.proxy.d;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class PlayGameInvocationHandle<T> implements InvocationHandler {

    T target;

    public PlayGameInvocationHandle( T target) {
        this.target = target;
    }

    public <T> T newInstance(Class<T> clz) {
        return (T) Proxy.newProxyInstance(clz.getClassLoader(), new Class[] { clz }, this);
    }

    /**
     * proxy:代表动态代理对象
     * method：代表正在执行的方法
     * args：代表调用目标方法时传入的实参
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        if (Object.class.equals(method.getDeclaringClass())) {
            try {
                // 诸如hashCode()、toString()、equals()等方法，将target指向当前对象this
                Object invoke = method.invoke(this, args);
                return invoke;
            } catch (Throwable t) {
            }
        }
        System.out.println("执行之前");
        Object invoke = method.invoke(target, args);
        System.out.println("执行之后");
        return invoke;
    }
}
